/**********************************************************************
 *** *                                                            * ***
 *** *  Copyright (c) 2013 Harmonia Holdings Group LLC            * ***
 *** *                                                            * ***
 *** * Permission is hereby granted to use, modify, copy, and     * ***
 *** * distribute this software and its documentation for any     * ***
 *** * purpose only without profit, provided that the above       * ***
 *** * Copyright Notice appears in all copies and that both the   * ***
 *** * Copyright Notice and this Permission Notice appears in     * ***
 *** * every copy of supporting documentation.  No title to nor   * ***
 *** * ownership of the software is transferred hereby.  The name * ***
 *** * of Harmonia Holdings Group LLC shall not be used in        * ***
 *** * advertising or publicity related to the distribution of    * ***
 *** * the software without specific, written, prior permission.  * ***
 *** * This software is provided as-delivered without expressed   * ***
 *** * or implied warranty.  Harmonia Holdings Group LLC          * ***
 *** * makes no representation about the suitability of this      * ***
 *** * software for any purpose and accepts no responsibility for * ***
 *** * its use.                                                   * ***
 *** *                                                            * ***
 *** ************************************************************** ***
 *** *                                                            * ***
 *** * This program is free software; you can redistribute it     * ***
 *** * and/or modify it under the terms of the GNU General Public * ***
 *** * License as published by the Free Software Foundation;      * ***
 *** * either version 2 of the License, or (at your option) any   * ***
 *** * later version.                                             * ***
 *** *                                                            * ***
 *** * This program is distributed in the hope that it will be    * ***
 *** * useful, but WITHOUT ANY WARRANTY; without even the implied * ***
 *** * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR    * ***
 *** * PURPOSE.  See the GNU General Public License for more      * ***
 *** * details.                                                   * ***
 *** *                                                            * ***
 *** * You should have received a copy of the GNU General Public  * ***
 *** * License along with this program; if not, write to the Free * ***
 *** * Software Foundation, Inc., 51 Franklin Street, Fifth       * ***
 *** * Floor, Boston, MA 02110-1301, USA.                         * ***
 *** *                                                            * ***
 *** * For more information: http://www.gnu.org/licenses/gpl.html * ***
 *** *                                                            * ***
 **********************************************************************/
package org.etexascode.interrep.datamodel;
import java.util.*;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * The adapter for the map of detectors.
 * @author jrutherford
 */
//@XmlSeeAlso(value = {Lane.class, SignalIndication.class, Detector.class})
@XmlSeeAlso(value = {Lane.class, Detector.class})
public class ManagerAdapter<T> extends XmlAdapter<ManagerAdapter.Adapted<T>, Map<Integer, T>> 
{
	@Override
	public Adapted<T> marshal(Map<Integer, T> v) throws Exception {
		if(null == v) {
			return null;
		}
		Adapted<T> adaptedI2 = new Adapted<T>();
		for(Map.Entry<Integer, T> entry : v.entrySet()) {
			adaptedI2.entry.add(new Entry<T>(entry.getKey(), entry.getValue()));
		}
		return adaptedI2;
	}

	@Override
	public Map<Integer, T> unmarshal(Adapted<T> v) throws Exception {
		if(null == v) {
			return null;
		}
		Map<Integer, T> map = new HashMap<Integer, T>();
		for(Entry<T> entry : v.entry) {
			map.put(entry.key, entry.value);
		}
		return map;
	}

	
	/** List for adapted. */
	public static class Adapted<T> { 
		public List<Entry<T>> entry = new ArrayList<Entry<T>>(); 
	}

	/**
	 * The converted entry class.
	 * @author jrutherford
	 */
	public static class Entry<T> {
		/** The key. */
		public Integer key;

		/** The detector. */
		@XmlElement
		public T value;
		
		
		/** Empty Constructor. */
		public Entry() { }

		/** Constructor. */
		public Entry(Integer key, T value) {
			this.key = key;
			this.value = value;
		}
	}
}